// JavaScript 状态模式是一种非常有用和强大的设计模式，它可以帮助开发人员管理对象的不同状态和相应的行为。通过将状态和行为分离，状态模式可以提高代码的可扩展性和复用性。



// 优点
// 定义了状态与行为之间的关系，封装在一个类里，更直观清晰，增改方便
// 状态与状态间，行为与行为间彼此独立互不干扰
// 用对象代替字符串来记录当前状态，使得状态的切换更加一目了然

// 缺点
// 会在系统中定义许多状态类
// 逻辑分散

// 可以使用状态模式和策略模式, 消除代码中大量的 if else

// 状态模式经典实例, 红绿灯
class TrafficLight {
    currentLight:BaseLight
    constructor(){
        this.currentLight = null
    }

    change(light:BaseLight){
        this.currentLight = light;
        this.currentLight.go()
    }
}


abstract class BaseLight {
    abstract go();
}

class RedLight extends BaseLight {
    go(){
        console.log("红灯停")
    }
}

class GreenLight  extends BaseLight{
    go(){
        console.log("绿灯行")
    }
}

class YellowLight  extends BaseLight{
    go(){
        console.log("黄灯猛冲")
    }
}

const trafficLight = new TrafficLight();

trafficLight.change(new RedLight());
trafficLight.change(new GreenLight());
trafficLight.change(new YellowLight());

//  1 必须要有一个Context类，这个类持有State接口，负责保持并切换当前的状态。
// 状态模式没有定义在哪里进行状态转换，本例是在Context类进行的，也有人在具体的State类中转换
// 状态模式, 不同 状态完成的任务不同 , 在上面代码中, 就是在不同的 go方法中实现具体的逻辑
